#include <bits/stdc++.h>
using namespace std;
string a, b;
int n1[11505];
int n2[11505];
int n3[11505];
void f1(string a, string b)
{
    n1[0] = a.size();
    n2[0] = b.size();
    for (int i = 1; i <= n1[0]; i++)
        n1[i] = a[n1[0] - i] - '0';
    for (int i = 1; i <= n2[0]; i++)
        n2[i] = b[n2[0] - i] - '0';
    //转换
    if (n1[0] > n2[0]) //选长的作为第一个数
    {
        for (int i = 1; i <= n2[0]; i++)
        {
            n1[i] += n2[i];
        } //第一步全部加上
        int tmp = 0;
        int jw = 0;
        for (int i = 1; i <= n1[0]; i++) //第二部处理进位
        {
            if (n1[i] > 9) //如果某一位的数大于9就要进位
            {
                n1[i + 1] += n1[i] / 10; //这一位除以10就是要进的位
                n1[i] %= 10;             //这一位要留下一个数
            }
        }
        int len = n1[0];
        if (n1[n1[0] + 1] > 0) //由于处理问题,所以可能会出现999+1=000的情况,所以要单独处理一下
            n1[0]++;
        for (int i = n1[0]; i >= 1; i--)
            cout << n1[i];
    }
    else
    {
        //此处是以b作为第一个数的情况
        for (int i = 1; i <= n1[0]; i++)
        {
            n2[i] += n1[i];
        }
        int tmp = 0;
        int jw = 0;
        for (int i = 1; i <= n2[0]; i++)
        {
            if (n2[i] > 9)
            {
                n2[i + 1] += n2[i] / 10;
                n2[i] %= 10;
            }
        }
        if (n2[n2[0] + 1] > 0)
            n2[0]++;
        for (int i = n2[0]; i >= 1; i--)
            cout << n2[i];
    }
    return;
}
void f2(string a, string b)
{
    bool flg = false;
    if ((a.size() < b.size()) || (a.size() == b.size() && a < b)) //看第一个数是否大于第二个数,如果小于,就交换,并做标记.因为5-6=-(6-5)
    {
        flg = true;
        swap(a, b);
    }
    n1[0] = a.size();
    n2[0] = b.size();
    for (int i = 1; i <= n1[0]; i++)
        n1[i] = a[n1[0] - i] - '0';
    for (int i = 1; i <= n2[0]; i++)
        n2[i] = b[n2[0] - i] - '0';
    //转换,注意在交换之后
    int maxl = max(n1[0], n2[0]); //看哪个长
    for (int i = 1; i <= maxl; i++)
    {
        if (n1[i] - n2[i] < 0) //处理借位,如果某一位的结果是负数,那就借位
        {
            n1[i + 1] -= 1; //下一位-1
            n1[i] += 10;    //这一位+10
            //注意,都是同一个数
        }
        n3[i] = n1[i] - n2[i]; //相减
    }
    int len = maxl;
    while (n3[len] == 0 && len > 0)
        len--; //处理末尾零
    n3[0] = len;
    if (flg)
        cout << '-'; //如果有标记,说明这是个小减大,输出负号
    for (int i = n3[0]; i >= 1; i--)
        cout << n3[i];
    if (len < 1)
        cout << '0';
}
void f22(int *n1, int *n2)
{
    int maxl = n1[0];
    for (int i = 1; i <= maxl; i++)
    {
        if (n1[i] - n2[i] < 0) //处理借位,如果某一位的结果是负数,那就借位
        {
            n1[i + 1] -= 1; //下一位-1
            n1[i] += 10;    //这一位+10
            //注意,都是同一个数
        }
        n1[i] -= n2[i]; //相减
    }
    int len = maxl;
    while (n3[len] == 0)
        len--; //处理末尾零
    n1[0] = len;
}
void f3(string a, string b)
{
    n1[0] = a.size();
    n2[0] = b.size();
    for (int i = 1; i <= n1[0]; i++)
        n1[i] = a[n1[0] - i] - '0';
    for (int i = 1; i <= n2[0]; i++)
        n2[i] = b[n2[0] - i] - '0';
    //转换
    if (n1[0] < n2[0] || (n1[0] == n2[0] && a < b))
        swap(a, b);
    //方便处理,把大的放在第一位
    for (int i = 1; i <= n1[0]; i++)
        for (int j = 1; j <= n2[0]; j++)
            n3[i + j - 1] += n1[i] * n2[j];
    //相乘,注意必须是两层循环,就像竖式那样
    n3[0] = n1[0] + n2[0];
    for (int i = 1; i <= n3[0]; i++)
        if (n3[i] > 9) //处理进位
        {
            n3[i + 1] += n3[i] / 10;
            n3[i] %= 10;
        }
    int len = n3[0];
    while (n3[len] == 0 && len > 1)
        len--;
    n3[0] = len;
    for (int i = n3[0]; i >= 1; i--)
        cout << n3[i];
}
void mv(int *n1, int *n2, int j)
{
    for (int i = 1; i <= n1[0]; i++)
    {
        n2[i + j - 1] = n1[i];
    }
    n2[0] = n1[0] + j - 1;
}
int com(int *n1, int *n2)
{
    int i;
    if (n1[0] > n2[0])
        return 1;
    if (n1[0] < n2[0])
        return -1;
    for (i = n1[0]; i > 0; i--)
    {
        if (n1[i] > n2[i])
            return 1;
        if (n1[i] < n2[i])
            return -1;
    }
    return 0;
}
void f4(string a, string b)
{
    n1[0] = a.size();
    n2[0] = b.size();
    for (int i = 1; i <= a.size(); i++)
        n1[i] = a[a.size() - i] - '0';
    for (int i = 1; i <= b.size(); i++)
        n2[i] = b[b.size() - i] - '0';
    //转换
    int tmp[11500]; //用于存移位后的数
    //   40
    //  ---
    //3/120
    //  12
    //  ---
    //    0
    //上式中,要先算120-300,300就是移位的数
    //高精除是通过模拟除法的运转来实现的.
    int len = a.size() - b.size() + 1; //移位的位数
    n3[0] = len;                       //保存长度
    for (int i = len; i >= 1; i--)
    {
        memset(tmp, 0, sizeof(tmp)); //清空
        mv(n2, tmp, i);              //移位
        while (com(n1, tmp) >= 0)    //不断地减,一直减到不能减为止
        {
            n3[i]++;
            f22(n1, tmp);
        }
    }
    int t = n3[0];
    while (n3[t] == 0 && t > 0)
        t--; //处理末尾零
    n3[0] = t;
    for (int i = n3[0]; i >= 1; i--)
        cout << n3[i];
}
int main()
{
    cin >> a >> b;
    f1(a, b);
    cout << endl;
    memset(n1, 0, sizeof(n1));
    memset(n2, 0, sizeof(n2));
    memset(n3, 0, sizeof(n3));
    f2(a, b);
    cout << endl;
    memset(n1, 0, sizeof(n1));
    memset(n2, 0, sizeof(n2));
    memset(n3, 0, sizeof(n3));
    f3(a, b);
    cout << endl;
    memset(n1, 0, sizeof(n1));
    memset(n2, 0, sizeof(n2));
    memset(n3, 0, sizeof(n3));
    f4(a, b);
    return 0;
}